package org.rcy.framework.data.dao;

import org.rcy.framework.api.entity.IdEntity;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;

/**
 * @author 吴康桥
 * @Description
 * @date 2022/9/27 18:12
 */

public interface BaseDao<T extends IdEntity> extends CrudMapper<T, Long>, Mapper {

	/**
	 * 返回Example.Builder对象
	 *
	 * @param clazz 实体类型
	 * @return
	 */
	default Example.Builder exampleOf(Class<T> clazz) {
		return new Example.Builder(clazz);
	}

	/**
	 * 返回WeekendSqls 查询条件对象，可构建Criteria
	 *
	 * @return
	 */
	default WeekendSqls<T> criteria() {
		return WeekendSqls.<T>custom();
	}

	/**
	 * 保存对象，若实体主键存在则执行更新操作（null值也会被更新），否则插入一条新数据
	 *
	 * @param entity
	 * @return 保存后想数据
	 */
	default T save(T entity) {
		if (entity.getId() != null) {
			updateByPrimaryKey(entity);
		} else {
			insert(entity);
		}
		return entity;
	}

	/**
	 * 根据主键更新对象 ，<strong>实体属性中的null值会被更新</strong></br>
	 * @param entity
	 * @return 更新成功返回true，指定主键的数据不存在返回false
	 */
	default boolean update(T entity) {
		return update(entity,false);
	}

	/**
	 * 根据主键更新对象 ，<strong>若selective 为true,则实体属性中的null值不会被更新</strong></br>
	 * @param entity
	 * @param selective
	 * @return 更新成功返回true，指定主键的数据不存在返回false
	 */
	default boolean update(T entity,boolean selective) {
		if (entity == null || entity.getId() == null) {
			return false;
		}
		int line = selective ? updateByPrimaryKeySelective(entity) : updateByPrimaryKey(entity);
		return line == 1;
	}

	/**
	 * 根据主键查询对象
	 * @param id
	 * @return
	 */
	default T get(Long id) {
		return selectByPrimaryKey(id);
	}

	/**
	 * 根据主键字段进行删除
	 *
	 * @param id 数据主键
	 * @return 删除成功返回true，删除失败返回false
	 */
	default boolean delete(Long id) {
		int line = deleteByPrimaryKey(id);
		return line == 1;
	}

}
